import Cache from 'lru-cache'

const cache = new Cache({
  max: 10000,
  maxAge: 2000
  // maxAge: 2000 * 60 * 10 // 缓存时间设置为10分钟
})

const cacheUtil = {
  /**
   * 写入一个缓存
   * @param {string} key
   * @param {res} res
   * @param {string} value
   */
  set(res, key, value) {
    cache.set(key, value)
    res.end('写入成功')
  },
  /**
   * 取出对应的缓存
   * @param {string} key
   * @param {string} res
   */
  get(res, key) {
    const v = cache.get(key)
    res.end(v)
  },

  /**
   * 从缓存中删除一个key
   * @param {string} key
   * @param {string} res
   */
  del(res, key) {
    cache.del(key)
    res.end('已删除')
  },

  /**
   * 清除所有缓存
   * @param {string} res
   */
  reset(res) {
    cache.reset()
    res.end('已清空')
  }
}

/**
 * 用http的方式对缓存内容进行更新操作
 * @param {Object} params
 * @param {*} response
 * @param {*} next
 */
const httpCacheUtil = function(params, response, next) {
  const method = params.method
  const key = params.key
  const value = params.value
  const oldEnd = response.end
  response.end = function(data, encoding, cb) {
    return oldEnd(data, encoding, cb)
  }
  cacheUtil[method](response, key, value)
}

/**
 * serverMiddleware
 * @param {*} req
 * @param {*} res
 * @param {*} next
 */
export default function(req, res, next) {
  const url = req.url
  const params = {}
  const search = url.substr(url.indexOf('?') + 1)
  search &&
    search.split('&').forEach(ele => {
      const v = ele.split('=')
      params[v[0]] = v[1]
    })
  // 如果是操作性的请求
  if (url.indexOf('util') > -1) {
    httpCacheUtil(params, res, next)
    return
  }
  // 如果是可视化操作
  // 取出缓存
  const key = req.originalUrl
  const cacheHtml = cache.get(key)
  if (cacheHtml) {
    console.log('从缓存中读取', key)
    res.end(cacheHtml, 'utf-8')
    return
  } else {
    console.log('从接口中读取', key)
    // 重写response.end方法，在其中将html字符串放入缓存
    const oldEnd = res.end.bind(res)
    res.end = function(data, encoding, cb) {
      cache.set(key, data)
      return oldEnd(data, encoding, cb)
    }
  }
  next()
}
